Raspberry Pi Pico mobile
- MITライセンス
目標はミニマル作曲エンジン
https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230626/20230626134012.jpg
案出し
ブレッドボードで先に作るのが良さそう
- EEPROM
- Flashの空き領域を使う?
- オーディオジャック
- LM386によるアンプ?
- いったんなしでブレッドボードエリアを作れば良さそう
- 鉄板構成ならLM386のフットプリントは入れておいてよさそう
- SMD使うか?
- 十字キー+AB
- LiPoバッテリー
- いつものボードを足す
- SDカードは?
- 基板直付けスピーカー
- 家にあるやつと位置合わせ
名前
- 素材
- Pico
- Pi
- mobile
- Game
- PicoPo
- Raspberry Pi 【Pico Po】rtable Game Console
- 決定、ピコポ
設計
- Raspberry Pi Picoのフットプリント
- 液晶はOLEDでSPIっぽい
- TFTにも対応できそう
- 論理回路図実装メモ
- {3.3VだしM386ではうまく動かせなそう} LM386やボリューム
- {x} 代わりにブレッドボードエリアを作る?
- {つけない、代わりに全ピンをbreakoutする} FRAM
- {x} SD
- {x} やはりLiPoも付けるか・・?
- 乾電池の場所を乗っ取れない?
- いけそう
- ESPboy-WROOM-02のフットプリントを修正する
- {x} 電位測定もやろう
- {x} 基板直付けスピーカーのフットプリントもつける
- アンプのためのブレッドボードエリアも作る?
- {x} Raspberry Pi Picoは昇降圧DCDCがついている説
- 1.8~5.5Vを与えればいい感じに3.3Vにしてくれるらしい!!
設計ミス
- { } 全体的に穴が小さい(普通のピンがぎりぎり刺さる感じ)
- { } マイコンモジュールのGNDがほかのGNDとショートしていない(GNDシンボルの付け忘れ)
組み立て
- とりあえずマイコンとOLEDはピンヘッダで接続
あとやること
- {x} USB接続がまだ使えるか
- {x} OLED出力テスト
- {x} キー入力テスト
- { } ちょっとゲームみたいなのを使って遊ぶ
- {x} サウンド出力テスト
- やった、SMDスピーカーが動いた!
- {x} 乾電池駆動
- { } シーケンサを作る
- 和音は出せない
- {x} タイマー割込みで制御
- rectangle*100でもそこそこ動く
- { } 和音が出せるシーケンサを作る
- Arduinoか、MicroPythonのモジュールが必要
- { } 和音が出せる楽器を作る
- RakuChordのRaspberry Pi Pico版に向けた布石
記事の構成
- 基板設計
- ミスとリカバリ
- MicroPythonでプログラムを書く
- キー入力、サウンド出力、タイマー割込みのデモ
- ゲームとしてある程度遊べるものが作りたい気持ち
- FlappyBird?
- Tetris?
- シーケンサ
- まだ試していないこと
- カラーTFT
- SPI OLED
- 和音とゲーム
MicroPythonでモノトーンシーケンサ
- できたー
> code
from machine import Pin, I2C, PWM, Timer
import ssd1306
import time
buzzer = PWM(Pin(9))
idx = 0
i2c = I2C(0, sda=Pin(4), scl=Pin(5) , freq=400000)
BTNA = Pin(15, Pin.IN, Pin.PULL_UP)
BTNB = Pin(14, Pin.IN, Pin.PULL_UP)
BTNU = Pin(19, Pin.IN, Pin.PULL_UP)
BTND = Pin(17, Pin.IN, Pin.PULL_UP)
BTNL = Pin(18, Pin.IN, Pin.PULL_UP)
BTNR = Pin(16, Pin.IN, Pin.PULL_UP)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
count = 0
MAX_STEP = int(128/4)
MAX_TONE = int(64/4)
data = [False * MAX_TONE for _ in range(MAX_STEP)] playPos = 0;
def draw():
display.fill_rect(0,0,128,64,0)
for step in range(128/4):
for tone in range(64/4):
display.fill_rect(step*4, tone*4, 4, 4, 1)
display.fill_rect(pos0*4, pos1*4, 4, 4, 1) display.fill_rect(playPos*4, 0, 1, 64, 1)
def tick(timer):
global idx
global count
global pos
global playPos
draw()
count = count + 1
if count > 2:
count = 0
playPos = playPos + 1
if playPos >= 8:
playPos = 0
display.show()
if(BTNA.value() == 0):
if(BTNB.value() == 0):
if(BTNU.value() == 0):
if(BTND.value() == 0):
if(BTNL.value() == 0):
if(BTNR.value() == 0):
f = False
for i in range(MAX_TONE):
buzzer.duty_u16(256*16)
f = True
if not(f):
buzzer.duty_u16(0)
tim = Timer()
tim.init(period=100, mode=Timer.PERIODIC, callback=tick)
<<
Arduino環境で和音
- できるかな?
- ほぼそのまま持っていけばできそう
- やるぞ
- 事前にMicroPythonのコードをバックアップしておいた方がよさそう
- 和音のコードをコピペするだけで動くといいな
- 音を鳴らすサンプルで動作テスト
- 動いた!
- OLEDはu8g2で行ける?
- SW I2Cで試す
- うごかない、コンパイルはできるがOLEDが反応しない
- HW I2Cはピンが固定か?
- こっちの方が動いた!
- OLEDと和音をくっつける
- コンパイル遅いなー、動作確認が出来たらPlatformioにしたい
- 雰囲気できた
- 普通に開発出来て良い
- 過去にArduboy用に作ったプロジェクトを少し直すと動きそうに見える
- 描画命令、音命令を変更すればよい
改良案
- アンプを乗せる
- 動作確認済み
- やや音が割れる
- 設計ミスの修正